home *** CD-ROM | disk | FTP | other *** search
/ The X-Philes (2nd Revision) / The X-Philes Number 1 (1995).iso / xphiles / hp48_2 / areuh.tar / areuh / assembler / ainput.c < prev    next >
C/C++ Source or Header  |  1990-10-10  |  5KB  |  178 lines

  1. /*
  2.  * Authors :
  3.  *   Pierre DAVID (pda@masi.ibp.fr or pda@frunip62.bitnet)
  4.  *   Janick TAILLANDIER
  5.  *
  6.  * This program can be freely used or distributed as long as this
  7.  * note is kept.
  8.  *
  9.  * This program is provided "as is".
  10.  */
  11.  
  12. /******************************************************************************
  13.  
  14.                                 TITAN ASSEMBLER
  15.  
  16.                         INPUT STREAM READING & PARSING
  17.  
  18.  
  19.  
  20. read_line, parse_line, next_token, stcp
  21.  
  22. ******************************************************************************/
  23.  
  24. #include "aglobal.h"
  25.  
  26.  
  27.  
  28. /******************************************************************************
  29.  
  30.                                    READ_LINE
  31.  
  32.  
  33. synopsis : int read_line (fd, line)
  34.            FILE *fd
  35.            uchar *line
  36. description : read_line reads a line from the source file, or stdin.
  37. note : read_line returns -1 if EOF reached, 0 otherwise.
  38.  
  39. ******************************************************************************/
  40.  
  41. int read_line (fd, line)
  42. FILE *fd ;
  43. uchar line[] ;
  44. {
  45.     int c, i = -1 ;
  46.  
  47.     do
  48.     {
  49.         c = getc (fd) ;
  50.         if (i<MAXLEN)
  51.             line[++i] = (uchar) c ;
  52.     }
  53.     while ((c!=EOF)&&(c!='\n')) ;
  54.     line[i] = EOL ;
  55.     if (c==EOF)
  56.     {
  57.         if (ferror (fd))  error (ERRRD, fsource) ;    /* stdin doesn't fail */
  58.     }
  59.     else c = 0 ;
  60.  
  61.     linenb++ ;
  62.     return (c) ;
  63. }
  64.  
  65.  
  66. /******************************************************************************
  67.  
  68.                                   PARSE_LINE
  69.  
  70.  
  71. synopsis : void parse_line (line, label, mnemo, modif)
  72.            uchar *line, *label, *mnemo, *modif
  73. description : parse_line breaks the line read from the source file in three
  74.               components :
  75.                 - label : max LBLLEN or LBLLEN+1 characters
  76.                 - mnemonic : max 6 characters
  77.                 - modifier : not limited (in fact, MAXLEN characters)
  78. note : parse_line doesn't return a result, the line is always valid.
  79.  
  80. ******************************************************************************/
  81.  
  82. void parse_line(line, label, mnemo, modif)
  83. uchar *line, *label, *mnemo, *modif ;
  84. {
  85.     int i=0, j ;
  86.  
  87.     *label = EOL ;
  88.     *mnemo = EOL ;
  89.     *modif = EOL ;
  90.  
  91. /* label parse */
  92.  
  93.  
  94. /*               no label      comment       null line     tab *
  95.  *               |             |             |             |   *
  96.  *               v             v             v             v   */
  97.  
  98.     if ((*line!=' ')&&(*line!='*')&&(*line!=EOL)&&(*line!='\t'))
  99.         i = stcp (label, line, 0, (*line=='=') ? LBLLEN+1 : LBLLEN) ;
  100.     else if ((*line!='\t')&&(*line!='*')&&(*line!=EOL)&&
  101.              (line[1]!=' ')&&(line[1]!='*')&&(line[1]!=EOL)&&(line[1]!='\t'))
  102.         i = stcp (label, line, 1, (line[1]=='=') ? LBLLEN+1 : LBLLEN) ;
  103.         
  104.  
  105. /* mnemonic parse */
  106.  
  107.     i = next_token (line, i) ;
  108.     if (i<0) return ;
  109.     if (line[i]=='*') return ;
  110.     i = stcp (mnemo, line, i, 6) ;
  111.     for (j=0; j<6; j++) mnemo[j] -= ((mnemo[j]<'a')||(mnemo[j]>'z')) ? 0 : 32 ;
  112.  
  113. /* modifier parse */
  114.  
  115.     i = next_token (line, i) ;
  116.     if (i<0) return ;
  117.     strcpy (modif, line+i) ;
  118. }
  119.  
  120.  
  121. /******************************************************************************
  122.  
  123.                                   NEXT_TOKEN
  124.  
  125.  
  126. synopsis : int next_token (line, i)
  127.            uchar *line
  128.            int i
  129. descrption : next_token looks the line, from the i-th position, for the next
  130.              non-blank character or end of line. If end-of-line is reached,
  131.              a negative value (-1) is returned to caller. Otherwise, the
  132.              position of character is returned, which permits to reassign
  133.              the line index (i=next_token(line, i)).
  134.  
  135. ******************************************************************************/
  136.  
  137. int next_token (line, i)
  138. uchar *line ;
  139. int i ;
  140. {
  141.     while ((line[i]!=EOL)&&((line[i]==' ')||(line[i]=='\t'))) i++ ;
  142.     return ((line[i]) ? i : -1);
  143. }
  144.  
  145.  
  146. /******************************************************************************
  147.  
  148.                                      STCP
  149.  
  150.  
  151. synopsis : int stcp (str1, str2, i, lmax)
  152.            uchar *str1, *str2
  153.            int i, lmax
  154. description : stcp is an alternate name for "string_copy". In fact, stcp copies
  155.               str2 (from i-th position) into str1 (from 0-th position) until a
  156.               blank character of end-of-line is reached. If lmax (max length of
  157.               str1) is is reached, the rest of the field is ignored.
  158.               The returned value is the new line index value.
  159. note : we assume that stcp works well. No error value is returned.
  160.  
  161. replace with "strncpy" in C library for future releases
  162.  
  163. ******************************************************************************/
  164.  
  165. int stcp (str1, str2, i, lmax)
  166. uchar *str1, *str2;
  167. int i, lmax;
  168. {
  169.     int j=0;
  170.     do
  171.     {
  172.         if (j<lmax) str1[j++] = str2[i];
  173.     }
  174.     while ((str2[++i]!=' ')&&(str2[i]!='\t')&&(str2[i]!=EOL));
  175.     str1[j] = EOL;
  176.     return (i);
  177. }
  178.